/**
*  Classe que representa uma Açao
*  
*  @file
*  @version 1.0
*
*  
*  @section Description
*  Esta classe representa uma Açao.
*/


#import <Foundation/Foundation.h>
#import "Actions.h"
#import "DBInterface.h"
#import "DataContext.h"
#import "Resource.h"
#import "Library.h"
#import "Project.h"
#import "Priority.h"
#import "History.h"

@class Resource;
@class Comment;
@class Actions;
@class Project;
@class Priority;
@class History;


/**
 Header para a classe Action. Esta classe tem o objectivo de encapsular o objecto de acesso a dados Actions. 
 Toda a logica que for necessária de implmentar no objecto Action, extra aquela que o gerador de código criou, deve ser feita nesta
 classe.
 */
@interface Action : NSObject <DBInterface>{
	/**
	 Objecto de acesso a dados Actions. Este objecto tem toda a lógica a nível de acesso a dados para este objecto.
	 Tem também a capacidade de automaticamente criar os scripts SQL para efectuar pedidos a BD.
	 */
	Actions *actionsObject;
	
	/**
	 Coleçao de objectos Resource associados a esta Action. 
	 Esta coleçoes devem ser preenchidas com a ajuda da classe DataContext.
	 */
	@private NSMutableArray *resourceList;
	
	/**
	 Coleçao de objectos Comment associados a esta Action. 
	 Esta coleçoes devem ser preenchidas com a ajuda da classe DataContext.
	 */
	@private NSMutableArray *commentList;
	
	/**
	 Coleçao de objectos History associados a esta Action. 
	 Esta coleçoes devem ser preenchidas com a ajuda da classe DataContext.
	 */
	@private NSMutableArray *historyList;
	
	/**
	 Propriedade que indica a prioridade da action
	*/
	@private Priority * actionPriority;
	
	/**
	 Flag para marcar se o objecto foi alterado. 
	 */
	@private bool changed;
	
	/**
	 Flag para marcar se o objecto nao existe na BD. 
	 */
	@private bool isNew;
}


	/**
	 Propriedade com o objecto Actions.
	 */ 
@property (readwrite, assign) 	Actions *actionsObject;

	/**
	 Propriedade com a coleçao de Comment's associada a este objecto.
	 */
@property (readonly)  NSMutableArray *commentList;

	/**
	 Propriedade com a coleçao de Resource's associada a este objecto.
	 */
@property (readonly)  NSMutableArray *resourceList;

	/**
	 Propriedade com a coleçao de History's associada a este objecto.
	 */
@property (readonly)  NSMutableArray *historyList;


	/**
	 Propriedade com o objecto Priority.
	 */ 
@property (readwrite, assign) 	Priority *actionPriority;

	/**
	 Propriedade que indica se o objecto nao existe na BD.
	 */
@property (readwrite)  bool  isNew;

	/**
	 Propriedade que indica se este objecto foi alterado desde que foi carregado da BD.
	 */
@property (readwrite)  bool  changed;


			/********SELECTORS*************/

	/*! Retorna o Selector que permite alterar a data no valor de Finish Date. 
	* @return Selector que permite alterar a data no valor Finish. 
	 */
- (SEL) getSetFinishSelector;

	/*! Retorna o Selector que permite alterar a data no valor BaselineFinish.
	 * @return Selector que permite alterar a data no valor BaselineFinish. 
	 */
- (SEL) getSetBaselineFinishSelector;

			/********SELECTORS*************/


			/********CONSTRUCTORS**********/

	/**
	 Construtor a partir do objecto Project. 
	 @param project Projet ao qual esta Action vai estar associada.
	 @return Instancia.
	 */
- (id) initWithProject : (Project *) project;

	/*!Construtor a partir do objecto Actions. 
	 @param actions Objecto da BD que vai dar origem ao ojecto Action.
	 @return Instancia.
	 */
- (id) initWithActions : (Actions *) actions;


			/********CONSTRUCTORS**********/



			/********GETTERS**************/

	/**
	 @return A Descriçao desta açao. 
	 */
- (NSString *) getActionDescription;
	
	/**
	 @return O Owner desta açao. 
	 */
- (NSString *) getOwner;

	/**
	 @return O tempo em segundos desde Janeiro de 1970 até ao valor de DateCreated. 
	 */
- (double) getDateCreated;

	/**
	@return O tempo em segundos desde Janeiro de 1970 até ao valor de BaseLineFinish. 
	*/
- (double) getBaseLineFinish;

	/**
	@return O tempo em segundos desde Janeiro de 1970 até ao valor de Finish. 
	*/
- (double) getFinish;

	/**
	 @return o Identificador na BD para este objecto.
	 */
- (int) getActionId;

			/********GETTERS**************/


			/********SETTERS**************/

	/**
	 Metodo para alterar a descriçao
	 @param descript Nova descricao para esta Açao.
	*/
- (void) setActionDescription : (NSString *) descript;

	/**
	Metodo para alterar a FinishDate
	@param time nova data.
	*/
- (void) setFinishDate : (double) time;
	
	/**
	Metodo para alterar a BaselineFinish
	@param time nova data.
	*/
- (void) setBaselineFinishDate : (double) time;

			/********SETTERS**************/


			/********LOADERS & UNLOADERS***/

	/**
	Metodo para carregar os Comentarios associados a este objecto para a coleçao commentList.
	*/
- (void) loadComments;

	/**
	Metodo para carregar os Comentarios associados a este objecto para a coleçao resourceList.
	*/
- (void) loadResources;

	/**
	Metodo para carregar os Comentarios associados a este objecto para a coleçao historyList.
	*/
- (void) loadHistory;

	/**
	Metodo para carregar a prioridade desta acao.
	*/
- (void) loadPriority;

			/********LOADERS & UNLOADERS***/

			/********CollectionS***********/

	/**
	 Metodo para adicionar novo comentario a esta açao.
	 @param comment Comentario a adicionar.
	 */
- (void) addComment : (Comment *) comment;

	/**
	 Metodo para adicionar novo recurso a esta açao.
	 @param comment Comentario a adicionar.
	 */
- (void) addResource : (Resource *) contact;

			/********CollectionS***********/
@end
